package io.bdmc.modules.sys.controller;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.Sha256Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import io.bdmc.common.utils.HttpContextUtils;
import io.bdmc.common.utils.IPUtils;
import io.bdmc.common.utils.MyMap;
import io.bdmc.common.utils.MyPage;
import io.bdmc.common.utils.R;
import io.bdmc.modules.sys.entity.SysLoginHistory;
import io.bdmc.modules.sys.entity.SysUser;
import io.bdmc.modules.sys.model.SysLoginHistoryParam;
import io.bdmc.modules.sys.service.ISysLoginHistoryService;
import io.bdmc.modules.sys.service.SysUserService;
import io.bdmc.modules.sys.service.SysUserTokenService;

/**
 * 登录相关
 * 
 * @author huang lu
 * @email hlkyo@qq.com
 * @date 2016年11月10日 下午1:15:31
 */
// "登录", description = "/sys/login")
@RestController
@RequestMapping("/sys/login")
public class SysLoginController {

	@Autowired
	private SysUserService sysUserService;
	@Autowired
	private SysUserTokenService sysUserTokenService;

	@Autowired
	ISysLoginHistoryService _sysloginhistorySvs;

	@GetMapping("/list")
	// "分页查询登录日志", notes = "分页查询")
	public R list(SysLoginHistoryParam params) {
		MyPage<SysLoginHistory> myPage = new MyPage<SysLoginHistory>(params.getCurrent(), params.getSize());
		MyPage<SysLoginHistory> map = _sysloginhistorySvs.mySelectPage(myPage, params);
		return R.ok().putData(MyMap.ok(map.getRecords(), map.getTotal()));
	}

	/**
	 * 登录
	 */
	@PostMapping(value = "/login")
	public Map<String, Object> login(String username, String password, String captcha) throws IOException {
		// String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
		// if(!captcha.equalsIgnoreCase(kaptcha)){
		// return R.error("验证码不正确");
		// }

		// 用户信息
		SysUser user = sysUserService.queryByUserName(username);
		LocalDateTime now = LocalDateTime.now();
		// 账号不存在、密码错误
		if (user == null) {
			return R.error(-1, "账号不存在");
		}
		// 解锁5分钟之前的
		if (user.getStatus() == 0 && user.getLockTime().plusMinutes(5L).isBefore(now)) {
			user.setWrongPwdTimes(0);
			user.setStatus(1);
			user.updateById();
		}
		// 账号锁定
		if (user.getStatus() == 0) {

			return R.error(-1, "账号已被锁定,请联系管理员");
		}
		SysLoginHistory his = new SysLoginHistory();
		his.setLoginName(username);
		his.setLoginTime(now);
		HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
		his.setUserAgent(request.getHeader("User-Agent"));
		his.setIpAddr(IPUtils.getIpAddr(request));
		his.setCreateTime(now);

		if (!user.getPassword().equals(new Sha256Hash(password, user.getSalt()).toHex())) {
			his.setPasswordOk(false);
			if (user.getWrongPwdTimes() >= 5) {
				user.setStatus(0);
				user.setLockTime(now);
				user.updateById();

				his.insert();
				return R.error(-1, "连续输入错误次数超过5次，账号已被锁定,请联系管理员");
			} else {

				his.insert();
				user.setWrongPwdTimes(user.getWrongPwdTimes() + 1);
				user.updateById();
				return R.error(-1, "账号或密码不正确,已连续输入错误次数:" + user.getWrongPwdTimes());
			}
		}

		his.setPasswordOk(true);
		his.insert();

		user.setWrongPwdTimes(0);
		user.updateById();
		// 生成token，并保存到数据库
		R r = sysUserTokenService.createToken(user.getUserId());

		return r;
	}

	/**
	 * 未登录，shiro应重定向到登录界面，此处返回未登录状态信息由前端控制跳转页面
	 * 
	 * @return
	 */
	@RequestMapping(value = "/unauth")
	@ResponseBody
	public Object unauth() {

		return R.error(401, "未登录");

	}

	@PostMapping("/logout")
	public R logout() {
		SecurityUtils.getSubject().logout();
		return R.ok();
	}

}
